package com.njxxted.activiti.common.listener.process;

import com.njxxted.activiti.common.util.ContextFactoryUtil;
import com.njxxted.activiti.common.util.DateUtil;
import com.njxxted.activiti.modules.process.defintion.dao.ActDefinitionDao;
import com.njxxted.activiti.modules.process.defintion.entity.ActNodeConfigEntity;
import org.activiti.engine.delegate.DelegateTask;

import java.util.Date;
import java.util.List;

/**
 * 描述：一般任务开始事件监听器。 <pre>
 *     1.携带上一任务的分发令牌。
 *     2.记录新产生的任务，为后续的回退作准备。
 *     3.添加流程意见。
 *     4.启动流程时添加或保存状态数据。
 *     5.如果当前节点是分发节点则进行任务分发，并直接返回，否则往下执行。
 *     6.从上下文中获取分配人员的数据，进行分配，如果有人员则进行分配，如果没有则往下执行。
 *     7.从数据库中加载人员进行人员分配。
 * <p>
 * 作者：Ostrich Hu
 * 时间：2019/8/9 10:10 星期五
 */
public class TaskCreateListener extends BaseTemplateTaskListener {

    private static final long serialVersionUID = 7431672174950507061L;

    private ActDefinitionDao actDefinitionDao;

    {
        actDefinitionDao = (ActDefinitionDao) ContextFactoryUtil.getBean("actDefinitionDao");
    }

    @Override
    protected void execute(DelegateTask delegateTask, String processDefId, String activityId) {
        logger.debug("触发任务创建监听器：\n任务节点id：{}\n流程定义id：{}\n委托任务：{}", activityId, processDefId, delegateTask);
        //根据流程key和nodeId查询出配置的人员信息
        String processKey = processDefId.split("[:]")[0];
        //流程定义配置信息
        ActNodeConfigEntity nodeConfigEntity = new ActNodeConfigEntity();
        nodeConfigEntity.setKey(processKey);
        nodeConfigEntity.setNodeId(activityId);

        if (null != actDefinitionDao) {
            //查询流程定义配置信息，用于设置用户任务到期时间
            List<ActNodeConfigEntity> definitionSettings = actDefinitionDao.getProcessDefinitionSettings(nodeConfigEntity);

            definitionSettings.forEach(nodeConfig -> {
                String configType = nodeConfig.getConfigType();
                String otherValue = nodeConfig.getOtherValue();
                String configValue = nodeConfig.getConfigValue();
                //创建任务的时候，根据任务查询并设置当前任务的到期日期。
                if ("0".equals(otherValue) && "dueDate".equals(configType)) {
                    //无到期时间
                } else if ("1".equals(otherValue) && "dueDate".equals(configType)) {
                    //工作日
                    String workDay = DateUtil.getWorkDay(Integer.parseInt(configValue));
                    delegateTask.setDueDate(DateUtil.stringConvertToDate(workDay, DateUtil.DATE_FORMAT_YMD));
                } else if ("dueDate".equals(configType)) {
                    //日历日
                    Date dateDay = DateUtil.getDateAfter(new Date(), Integer.parseInt(configValue));
                    delegateTask.setDueDate(dateDay);
                }

            });
        }
    }

    @Override
    protected Integer getScriptType() {
        return 1;
    }
}
